<?php

/**
 * 检查传入时间是否超过传入分钟数
 * @modify trainyao 2016-04-21   创建
 * @param  integer   $time        传入时间
 * @param  integer   $minute      分钟数
 * @return boolean              超过返回true,不超过返回false
 */
function isOverMinute($time, $minute = 5) {
    if (!is_numeric($time)) {
        $time = strtotime($time);
    }
    $currentTime = time();
    return ($time + ((int)$minute * 60)) < $currentTime ? true : false;
}

/**
 * 返回当前日期
 * @modify trainyao 2015-09-26 创建
 * @param string $format  日期格式,默认Y-m-d
 * @return string
 */
function getCurrentDate($format = 'Y-m-d') {
    return date($format);
}

/**
 * 返回当前时间的时间戳
 * @modify trainyao 2015-09-26 创建
 * @return integer
 */
function getCurrentTimestamp() {
    return time();
}

/**
 * 返回当前时间
 * @modify trainyao 2015-09-26 创建
 * @param string $format  时间格式,默认Y-m-d H:i:s
 * @return string
 */
function getCurrentTime($format = 'Y-m-d H:i:s') {
    return date($format);
}

/**
 * 返回几个月后的时间
 * @param date $startTime  2015-09-12 12:00:00
 * @param int $months  月数
 */
function getFutureTime($startTime, $months) {
    $temp_startTime = strtotime($startTime);
    $result_endTime = strtotime("+" . $months . " months", $temp_startTime);
    return date("Y-m-d H:i:s", $result_endTime);
}

/**
 * 返回时间周期字符串
 * @param type $time_string
 * @return type
 */
function getTimeCycle($time_string) {
    $array = array(0 => '星期日', 1 => '星期一', 2 => '星期二', 3 => '星期三', 4 => '星期四',
        5 => '星期五', 6 => '星期六');
    $time_arr = explode(',', $time_string);
    $return_string = '';
    for ($i = 0; $i < count($time_arr); $i++) {
        $return_string.=$array[$time_arr[$i]] . ',';
    }
    return empty($return_string) ? '' : substr($return_string, 0, -1);
}

/**
 * 获取两个时间戳之间的间隔，以给定的单位返回，默认单位为分钟
 * @param  integer $startTime
 * @param  integer $endTime
 * @param  string $format    默认为'minute'
 * @return int 向下取整，不到1个单位算0个
 */
function getTimeDiff($startTime, $endTime, $format = 'minute') {
    $divisor = 1;
    switch ($format) {
        case 'day':
            $divisor = $divisor * 60 * 60 * 24;
            break;
        case 'hour':
            $divisor = $divisor * 60 * 60;
            break;
        case 'second':
            $divisor = 1;
            break;
        case 'minute':
            $divisor = 60;
            break;
        default:
            $divisor = 60;
            break;
    }

    return floor(($endTime - $startTime) / $divisor);
}

/**
 * 检测时间字符串格式是否正确
 * @param  string $str    输入的时间字符串
 * @param  string $format 时间格式
 * @return boolean
 */
function checkTimeStrFormat($str, $format = 'Y-m-d H:i:s') {
    $formatStr = date($format, strtotime($str));
    return $formatStr == $str;
}

/**
 * 比较两个时间字符串的先后
 * @param  string $time
 * @param  string $compare
 * @return boolean
 */
function isBeforeTime($time, $compare, $equal = false) {
    if ($equal !== false) {
        return strtotime($time) <= strtotime($compare);
    }
    return strtotime($time) < strtotime($compare);
}

/**
 * 比较时间是否在时间段内
 * @modify trainyao 2016-01-08 创建
 * @param  string   $time      比较时间
 * @param  string   $startTime 开始时间
 * @param  string   $endTime   结束时间
 * @return boolean             是否在时间段内
 */
function isBetweenTime($time, $startTime, $endTime) {
    $time = is_numeric($time) ? $time : strtotime($time);
    $startTime = is_numeric($startTime) ? $startTime :  strtotime($startTime);
    $endTime = is_numeric($endTime) ? $endTime :  strtotime($endTime);

    return ($startTime <= $time && $time <= $endTime);
}

/**
 * 返回预定开始时间
 * @param date $date 格式:date('Y-m-d')
 * @return type
 */
function getOrderStartTime($date) {
    return $date . " 00:00:00";
}

/**
 * 返回预定结束时间
 * @param date $date 格式：date('Y-m-d')
 * @param integer $nights 预定天数
 * @return date
 */
function getOrderEndTime($date, $nights) {
    return date('Y-m-d', strtotime($date) + $nights * 24 * 60 * 60) . " 00:00:00";
}

/**
 * 根据开始结束时间获取过了多少晚
 * @modify trainyao 2016-01-23 创建
 * @param  string   $startDate 开始时间
 * @param  string   $endDate   结束时间
 * @return integer              过了几晚
 */
function getNight($startDate, $endDate) {
    if (!is_numeric($startDate)) {
        $startDate = strtotime($startDate);
    }
    if (!is_numeric($endDate)) {
        $endDate = strtotime($endDate);
    }

    $night = round(($endDate - $startDate) / 86400);

    return ($night < 0) ? 0 : $night;
}

/**
 * 比较时间段一与时间段二是否有交集
 * @modify trainyao 2016-01-14      代码调整后无调用暂时删除方法
 * @param type $begintime1
 * @param type $endtime1
 * @param type $begintime2
 * @param type $endtime2
 * @return boolean
 */
// function isMixTime($begintime1, $endtime1, $begintime2, $endtime2) {
//     $status = $begintime2 - $begintime1;
//     if ($status > 0) {
//         $status2 = $begintime2 - $endtime1;
//         if ($status2 > 0) {
//             return false;
//         } else {
//             return true;
//         }
//     } else {
//         $status2 = $begintime1 - $endtime2;
//         if ($status2 > 0) {
//             return false;
//         } else {
//             return true;
//         }
//     }
// }

/**
 * 检查开始结束时间是否存在交叉
 * @modify trainyao 2016-01-14 创建
 * @param  array   $timeArray 时间数组,array($startTime => $endTime, $startTime2 => $endTime2)
 * @param  string   $startTime 开始时间
 * @param  string   $endTime   结束时间
 * @param  integer   $orderRoomId   子订单id,新增订单时该值为null
 * @return mixin               无交叉返回新时间数组,有交叉返回false
 */
function checkTimeCross($timeArray, $startTime, $endTime, $orderRoomId) {
    // 开始时间重合,必定存在交叉
    if (!empty($timeArray[$startTime])) {
        $dbOrderRoomId = $timeArray[$startTime]['order'];
        if (empty($dbOrderRoomId) || (!empty($dbOrderRoomId) && $dbOrderRoomId != $orderRoomId)) {
            return false;
        }
    }

    $timeArray[$startTime]['end'] = $endTime;
    ksort($timeArray);
    $startTimes = array_keys($timeArray);
    $endTimes = array_values($timeArray);

    // 找出开始时间在众多开始时间内的顺序
    $number = array_search($startTime, $startTimes);

    $preIndex = $number-1;
    $nxtIndex = $number+1;
    // 判断是否被前一个时间交集到
    if ($preIndex >= 0 && !empty($endTimes[$preIndex]['end']) && $endTimes[$preIndex]['end'] > $startTime) {
        if ($endTimes[$preIndex]['order'] != $orderRoomId) {
            return false;
        }
    }
    // 判断是否交集到后一个时间
    if (!empty($startTimes[$nxtIndex]) && $endTime > $startTimes[$nxtIndex]) {
        // 第一个if:新增子订单时,有可能出现时间冲突,$endTimes[$nxtIndex]['order'] 和 $orderRoomId 都是null,要判断为时间时间冲突
        // 第二个if:修改同一个子订单时,不判断为时间冲突($endTimes[$nxtIndex]['order'] == $orderRoomId)
        // 第二个if:修改订单时,修改不同子订单($endTimes[$nxtIndex]['order'] != $orderRoomId),时间冲突,返回false
        if (!isset($endTimes[$nxtIndex]['order']) && is_null($orderRoomId)) {
            return false;
        }
        if ($endTimes[$nxtIndex]['order'] != $orderRoomId) {
            return false;
        }
    }

    return $timeArray;
}

/**
 * 根据两个时间字符串，计算出具体的日期数组返回
 * @modify AmosZhong 2016-01-26 创建
 */
function getDatesBetweenTime($startDate, $endDate, $endDateRequired = false) {
    $result = array();
    $startTime = strtotime($startDate);
    $endTime = strtotime($endDate);

    if ($endDateRequired) {
        while ($startTime <= $endTime){
            array_push($result, date('Y-m-d', $startTime));
            $startTime = strtotime('+1 day',$startTime);
        }
    } else {
        while ($startTime < $endTime){
            array_push($result, date('Y-m-d', $startTime));
            $startTime = strtotime('+1 day',$startTime);
        }
    }

    return $result;
}

/*
* 返回字符串的毫秒数时间戳
* @modify wenhui 2018-01-18 创建
*/
function getTotalMillisecond() {
    $time = explode (" ", microtime () );
    $time = $time [1] . ($time [0] * 1000);
    $time2 = explode ( ".", $time );
    $time = $time2 [0];

    return $time;
}

